高性能網(wǎng)站建設之 MS Sql Server數據庫分區
發(fā)布時(shí)間:2013-11-22 瀏覽:434打印字號:大中小
什么是數據庫分區?
數據庫分區是一種對表的橫向分割,Sql server 2005企業(yè)版和之后的Sql server版本才提供這種技術(shù),這種對表的橫向分割不同于2000中的表分割,它對訪(fǎng)問(wèn)用戶(hù)是透明的,用戶(hù)并不會(huì )感覺(jué)的表被橫向分割了。(2000中的表橫向分割是建n個(gè)表例如按時(shí)間建表每月一個(gè)表,表名不同,最后需要做一個(gè)大視圖)
關(guān)于具體的如何做分區,請參考數據庫分區演練http://www.cnblogs.com/yukaizhao/archive/2008/05/07/sql_partition_test.html
為什么要分區?
顯而易見(jiàn)分區是為了提高數據庫的讀寫(xiě)性能,提高數據庫的效率;
分區是否總是可以提高效率?
分區是一把雙刃劍,并不總能提高效率,這和具體情況有關(guān)系。
之所以有分區技術(shù),分區技術(shù)用的好的話(huà)可以提高性能,是因為一方面分區把一大塊數據分成了n小塊,這樣查詢(xún)的時(shí)候很快定位到某一小塊上,在小塊中尋址要快很多;另一方面CPU比磁盤(pán)IO快很多倍,而硬件上又有多個(gè)磁盤(pán),或者是RAID(廉價(jià)磁盤(pán)冗余陣列),可以讓數據庫驅動(dòng)CPU同時(shí)去讀寫(xiě)不同的磁盤(pán),這樣才有可能可以提高效率。
分區在有些時(shí)候并不能提高讀寫(xiě)效率,比如說(shuō)我們經(jīng)??吹降陌凑杖掌谧侄稳シ謪^MSDN例子,這個(gè)實(shí)例中是按照記錄的生成時(shí)間來(lái)分區的,把一年的數據分割成12個(gè)分區,每月一個(gè)。這樣的分區導致分區并不能實(shí)現CPU同步寫(xiě)并提高寫(xiě)入性能,因為在同一個(gè)時(shí)段CPU總是要寫(xiě)入到最新的那一個(gè)分區對應的磁盤(pán)中。另一個(gè)問(wèn)題是:這樣分區是否可以提高讀取性能呢?答案是不一定,要看根據什么字段來(lái)查詢(xún),如果是根據時(shí)間來(lái)查詢(xún),根據時(shí)間生成報表那么這種分區肯定會(huì )提高查詢(xún)的效率,但是如果是按照某個(gè)客戶(hù)查詢(xún)客戶(hù)最近1年內的賬單數據,這樣數據分布到不同的分區上,這樣的話(huà)效率就不一定能提高了,這要看數據在同一個(gè)分區上連續分布的讀性能高,還是CPU從幾個(gè)磁盤(pán)上同步讀取,然后在合并數據的性能更高一些,這和讀取數據的記錄數也有關(guān)系。
如何分區?用什么字段做分區依據?
具體如何分區和涉及的業(yè)務(wù)有關(guān)系,要看業(yè)務(wù)上最經(jīng)常的寫(xiě)入和讀取操作是什么,然后再考慮分區的策略。
既然與具體業(yè)務(wù)相關(guān),我們就假定一個(gè)業(yè)務(wù)環(huán)境,假如我們要做一個(gè)論壇,對論壇的帖子和回復表進(jìn)行分區。
論壇中最常見(jiàn)的寫(xiě)操作是1)發(fā)帖 2)回復帖子,
最常見(jiàn)的讀操作是
1) 根據帖子id顯示帖子詳情和分頁(yè)的帖子回復
2) 根據帖子版面帖子列表頁(yè)根據版面id分頁(yè)讀取帖子列表數據
怎么分區更合適呢?現在還沒(méi)有準確答案,我有兩種可能的方案,寫(xiě)下來(lái),大家討論看看。
方案1. 根據帖子ID區域段分區(1-300w一個(gè)分區、300w-600w一個(gè)分區…),這樣理論上可以提高帖子詳細頁(yè)的讀取速度,而對于寫(xiě)操作性能沒(méi)有益處,對于根據版面id讀取帖子列表頁(yè)有可能有益
方案2. 根據版面id進(jìn)行分區,這樣對于寫(xiě)性能應該有提高,不同的分區對應不同的版面,當有兩個(gè)版面同時(shí)有發(fā)帖回帖操作時(shí),有可能可以并發(fā)寫(xiě)。對于根據版面id獲得帖子列表頁(yè)數據也可以提高性能,而對于帖子詳細信息頁(yè)沒(méi)有性能影響。
多大的數據量才需要分區?
這個(gè)問(wèn)題只能說(shuō)一個(gè)內部標準,如果一張表的記錄超過(guò)在超過(guò)1000w,并以每月百萬(wàn)的數據量增長(cháng),那就需要分區。
關(guān)于具體的如何做分區,請參考數據庫分區演練http://www.cnblogs.com/yukaizhao/archive/2008/05/07/sql_partition_test.html


